<?php
class Pageview extends CI_Model {
        //==========================================================================================
        //==========================================================================================
        // Класс работы со страницами. Позволяет проверять права доступа к страницам для пользователя
        // и выводить страницы на экран. А также отображает меню
        //==========================================================================================
        
        private $page_id;                              //id страницы
        private $page_address;                         //адрес страницы
        private $page_name;                            //имя страницы
        private $parent_id;                            //индекс родительской страницы(по дереву сайта)
        private $page_body;                            //тело страницы в базе
        private $dynamic;                              //Страница 0-статическая(загужаемая из папки на веб сервере) или 1-динамическая загружаемая из базы
        private $page_owner_group = array();           //массив групп, которые имеют права на страницу
        private $menu_code='';
        private $righteditor_code='';
        
        function __construct()
        {
                // Call the Model constructor
                parent::__construct();
                $this->load->database();
        }
        
        
        //======================================================================================
        // Получить страницу $page_address для пользователя $usr
        //======================================================================================
        public function showpage($page_address,$ShowHeader=true, $ShowMenu=true){
                $data = array(
                                'title' => '',
                                'message' => '',
                                'head' => '',
                                'menu' => '',
                                'body' => ''
                );
                $name=$page_address;
                $query = "SELECT * from pages where page_address= ? AND deleted=0";
                if($res=$this->db->query($query, $name)){
                        if ($res->num_rows() > 0){
                                $row=$res->first_row('array');
                                log_message('debug', "Checking rights\r\nrow[id]=".$row['id']."\r\nrow[page_address]=".$row['page_address']);
                                //Записываем параметры страницы в класс
                                $this->page_id=$row['id'];
                                $this->page_address=$row['page_address'];
                                $this->page_name=$row['page_name'];
                                $data['title']=$row['page_name'];
                                $this->parent_id=$row['parent_id'];
                                $this->dynamic=$row['dynamic'];
                                if($this->dynamic){$this->page_body=$row['page_body'];}
                                $this->page_owner_group=$this->GetPOGByPageID($row['id'],$row['parent_id']);
                                log_message('debug','end getPOG\r\n ');
                                // Проверяем есть ли у пользователя права на страницу
                                if($this->CheckUserRight($this->myuser->getuseringroup(), $this->page_owner_group)){
                                        log_message('debug', "<br>Loading page....\r\n");
                                        if($ShowHeader){$data['head']= $this->page_name;}
                                        if($ShowMenu){
                                                $data['menu']=$this->GetMenu($this->page_id, 0, $this->myuser->getuseringroup());
                                                $data['menu'].= "<a href=\"http://".$this->input->server('HTTP_HOST').'/'.$this->config->item('index_page')."/pages/logout\">logout</a>\r\n";
                                        }
                                        if($this->dynamic){     $data['body']=$this->page_body;         }
                                        return $data;
                                }else{
                                        //--Нет прав доступа к странице
                                        log_message('debug','You have no right\r\n ');
                                        show_error('You have no right!'  );
                                }
                        }else{
                                log_message('debug','Page not find in database\r\n ');
                                //--Страница не найдена в базе данных
                                show_404($name);
                        }
                }else{
                        log_message('error', 'Ошибка связи с базой данных');
                        show_error('Ошибка связи с базой данных'  );
                }
        }
        
        //======================================================================================
        // Получить пользовательское меню
        // $curent_page- id активной страницы(для ее выделения)
        // $pageid - id корневой страницы дерева меню
        // $uig - массив групп пользователя
        //======================================================================================
        public function GetMenu($curent_page,$pageid, $uig){
                $res=$this->GetChild($pageid);
                $this->menu_code.= "<ul>\r\n";
                $i=0;
                $row=$res->first_row('array');
                while($i<$res->num_rows()){
                        if ($row['id']==$curent_page){
                                $style="style=\"color: #FF5555;\"";
                        }else{
                                $style="style=\"color: #111111;\"";
                        }
                        $pog=$this->GetPOGByPageID($row['id'], $pageid);
        
                        if($this->CheckUserRight($uig, $pog)){
                                $this->menu_code.= "<li><a href=\"http://".$this->input->server('HTTP_HOST').'/'.$this->config->item('index_page')."/$row[page_address]\" $style> ".$row['page_name'];
                                $res2=$this->GetChild($row['id']);
                                $row2=$res2->first_row('array');
                                if($row2){ $this->GetMenu($curent_page, $row['id'],$uig);}
                                $this->menu_code.= "</a></li>\r\n";
                        }
                        //                              echo "<br> groupi $i=".$this->page_owner_group[$i];
                        $i++;
                        $row=$res->next_row('array');
                }
                $this->menu_code.= "</ul>\r\n";
                return $this->menu_code;
        }
        
        //======================================================================================
        // Получить информацию о дочерних страницах
        //======================================================================================
        public function GetChild($pageid){
                $query = "SELECT * from pages where parent_id= ? AND deleted=0";
                $res=$this->db->query($query, $pageid);
                return $res;
        }
        
        //======================================================================================
        // Проверяем права пользователя $usr на страницу $this
        //$pog - массив групп доступа к странице, $uig массив групп пользователя
        //======================================================================================
        public function CheckUserRight($uig, $pog){
                $k=0;
                foreach ($pog as $pogkey => $pogvalue){
                        for($j=0; $j<count($uig); $j++){
                                if($pogkey==$uig[$j]){$k++; return $k;}
                        }
                }
        }
        
        //======================================================================================
        // Формируем массив групп page_owner_group для страницы $page_id
        //======================================================================================
        public function GetPOGByPageID($page_id,$parent_id=null){
                $i=0; //Стартовое значение элемента массива групп
                //Если не задан $parent_id находим его
                if(is_null($parent_id)){
                        $query = "SELECT * from pages where id= ? AND deleted=0";
                        if($res=$this->db->query($query, $page_id)){
                                if ($res->num_rows() > 0){
                                        $row=$res->first_row('array');
                                        $parent_id=$row['parent_id'];
                                }
                        }
                }
                log_message('debug',"function GetPOGByPageID parent_id=$parent_id\r\n");
                //Пока не дошли до вершины графа циклим
                while($page_id){
                        $query = "SELECT r.page_id, r.group_id, g.group_name from rights r inner join groups g on g.id=r.group_id where r.page_id= ? AND r.deleted=0";
                        if($res=$this->db->query($query, $page_id)){
                                if ($res->num_rows() > 0){
                                        //Добавляем права текущего узла
                                        $row = $res->first_row('array');
                                        $i=0;
                                        while($i<$res->num_rows()){
                                                $page_owner_group[$row['group_id']]=$row['group_name'];
                                                log_message('debug',"function GetPOGByPageID page_owner_group[{$row['group_id']}]={$row['group_name']}\r\n");
                                                $row = $res->next_row('array');
                                                $i++;
                                        }
                                }
                        }
                        if(isset($page_owner_group)){return $page_owner_group;}
                        //Если существует родитель поднимаемся на уровень вверх
                        if($parent_id){
                                $query = "SELECT * from pages where id= ? AND deleted=0";
                                if($res=$this->db->query($query, $parent_id)){
                                        if ($res->num_rows() > 0){
                                                $row=$res->first_row('array');
                                                $page_id=$row['id'];
                                                $parent_id=$row['parent_id'];
                                        }
                                }
                        }else{
                                //Завершаем цикл если родитель 0
                                $page_id=0;
                        }
                }
                //if(isset($page_owner_group)){return $page_owner_group;}
        }
        
        public function GetGroupList(){
        	$i=0;
        	$query = "SELECT * from groups where deleted=0";
        	if($res=$this->db->query($query)){    		
        		$i=0;
        		$row=$res->first_row('array');
        		while($i < $res->num_rows()){
        			$grouplist[$row['id']]=$row['group_name'];
        			$i++;
        			$row=$res->next_row('array');
        		}
        	}
        	return ($i)? $grouplist : false;
        }
        
        //======================================================================================
        // Получить меню редактора прав
        // $pageid - id корневой страницы дерева меню
        //======================================================================================
        public function ShowEditorMenu($pageid=0){
        	$uig=$this->myuser->getuseringroup();
        	$res=$this->GetChild($pageid);
        	$this->righteditor_code.= "<ul>";
        	$i=0;
        	$row=$res->first_row('array');
        	while($i<$res->num_rows()){
        
        		//Вычисляем массивы (pog-page owner groups) для текущй страницы $pog ее родителя $pogparent и их разницу $pogdiff
        		$pogparent=$this->GetPOGByPageID($pageid);
        		$pog=$this->GetPOGByPageID($row['id'], $pageid);
        		if($pageid>0){
        			$pogdiff=array_diff_assoc($pogparent,$pog);
        			//echo "<font color=blue>$pageid</font>";
        		}else{
        			$allgroups=$this->GetGroupList();
        			$pogdiff=array_diff_assoc($allgroups,$pog);
        		}
        		//Если у пользователя есть права на текущую страницу отображаем ее
        		if($this->CheckUserRight($uig, $pog)){
        			$pogstr='';
        			$page_address=$row['page_address'];
        			$page_id=$row['id'];
        			$style="style=\"color: #111111;\"";
        			foreach ($pog as $pogkey => $pogvalue){ $pogstr=$pogstr."<a class=\"groupsdel\" title=\"Убрать права на страницу {$page_address} у группы $pogvalue\" href=\"JavaScript:fmRightMenuAction({$page_id},{$pogkey},'delete')\" >".$pogvalue.'</a>';}
        			if(is_array($pogdiff)){
        				foreach ($pogdiff as $pogkey => $pogvalue){ $pogstr=$pogstr."<a class=\"groupsadd\" title=\"Добавить права на страницу {$page_address}  группе $pogvalue\" href=\"JavaScript:fmRightMenuAction({$page_id},{$pogkey},'add')\" >".$pogvalue.'</a>';}
        			}
        			$this->righteditor_code.= "<li><a href=\"".site_url($row['page_address'])."\" $style> ".$row['page_name'].'</a>'.$pogstr;
        			$res2=$this->GetChild($row['id']);
        			$row2=$res2->first_row('array');
        			if($row2){ $this->ShowEditorMenu($row['id']);}
        			$this->righteditor_code.= '</li>';
        		}
        		//				echo "<br> groupi $i=".$this->page_owner_group[$i];
        		$i++;
        		$row=$res->next_row('array');
        	}
        	$this->righteditor_code.= "</ul>";
        	return $this->righteditor_code;
        }
        
        //====================================================================
        //--Добавляем права на страницу $page_id для группы $group_id
        //====================================================================
        public function AddRight($page_id, $group_id){
        	$query = "insert into rights (page_id, group_id,deleted) values ( ?, ?, 0)";
        	$this->db->query($query, array($page_id, $group_id));
        }
        
        //====================================================================
        //--Забираем права на страницу $page_id  и все дочерние страницы для группы $group_id
        //--$rewrite нужно ли перезаписывать права узла
        //====================================================================
        public function DelRight($page_id, $group_id,$rewrite=1){
        	//Загружаем массив прав страницы
        	$pog=$this->GetPOGByPageID($page_id);
        	if($rewrite){
        		//Удаляем все права страницы $page_id
        		$query = "update rights set deleted=1 where page_id= ?";
        		$this->db->query($query, $page_id);
        		//Готовим запрос для перезаписи прав
        		$query = "insert into rights (page_id, group_id,deleted) values ( ?, ?, 0)";
        		//Перезаписываем права на страницу для всех групп массива $pog
        		foreach($pog as $pogkey => $pogvalue){
        			//Кроме $group_id
        			if($pogkey!=$group_id){
        				$this->db->query($query, array($page_id, $pogkey));
        			}
        		}
        	}else{
        		//Удаляем все права страницы $page_id для группы $group_id
        		$query = "update rights set deleted=1 where page_id= ? and group_id= ?";
        		$this->db->query($query, array($page_id, $group_id));
        	}
        	$res2=$this->GetChild($con,$page_id);
        	$i=0;
        	$row2=$res2->first_row('array');
        	while($i<$res2->num_rows()){
        		$this->DelRight($row2['id'], $group_id,0);
        		$i++;
        		$row2=$res2->next_row('array');
        	}
        }
        
        
}
